package org.example4;

import sun.misc.ProxyGenerator;

import java.io.File;
import java.io.FileOutputStream;

/**
 *  可以借助 sun.misc.ProxyGenerator工具类,可以自动生成接口的 jdk动态代理实现类
 *  并将该实现类的字节码写入到 target/genClassByJdk目录的文件中.
 *
 *  https://www.cnblogs.com/cleveraboy/p/9738940.html
 */
public class AppGetJdkProxyClassInfo {
    public static void main(String[] args) throws Exception {
        //原理：
        //1、拿到被代理对象的引用,并且获取到它的所有的接口,反射获取
        //2、JDK Proxy类重新生成一个新的类、同时新的类要实现被代理类所有实现的所有的接口
        //3、动态生成Java代码,把新加的业务逻辑方法由一定的逻辑代码去调用（在代码中体现）
        //4、编译新生成的Java代码.class
        //5、再重新加载到JVM中运行
        //以上这个过程就叫字节码重组
        //JDK中有个规范，只要要是$开头的一般都是自动生成的

        String clazzName = "$Proxy12";
//        byte[] bytes=ProxyGenerator.generateProxyClass(clazzName,new Class[]{Person.class});
        byte[] bytes=ProxyGenerator.generateProxyClass(clazzName,new Class[]{Animal.class});
        String dir =System.getProperty("user.dir") +"/jdkProxy/target/genClassByJdk/";
        String fileName= clazzName+".class";

        if (!new File(dir).exists()) {
            new File(dir).mkdirs();
        } else {
            deleteAllFilesInDir(new File(dir));
        }

        FileOutputStream fos=new FileOutputStream(dir+fileName);
        fos.write(bytes);
        fos.flush();
        fos.close();
        System.out.println(clazzName+"的class文件已经写在target/genClassByJdk目录中");
    }

    private static void deleteAllFilesInDir(File file) {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File f : files
                ) {
                    f.delete();
                }
            }
        }
    }
}